LIBRERÍAS

library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(foreign)
library(gridExtra)
library(seasonal)
library(lattice)
library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(urca)
library(dynlm)
library(TSstudio)
library(forecast)
library(car)
## Loading required package: carData
library(rio)

DATOS

Conversión de la serie

Se cuenta con una base diaria para determinar el proceso univariado de la variable Ventas. Se analiza el periodo de tiempo comprendido de sep-2022 a feb-2023, un histórico diario.

library(readxl)
SERIE <-rio::import("https://raw.githubusercontent.com/Brayanrys/SERIES/main/SERIES%20DE%20TIEMPO.csv")
SERIE$Fecha <- as.Date(SERIE$Fecha, format = "%Y-%m-%d")

ventas <- SERIE[, c("Ventas")]
z1 <- ts(ventas, start = c(2022,9), end = c(2023,2), frequency = 181)

summary(z1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   11.00   25.00   33.00   36.54   43.00  137.00

Resumen estadístico de la serie

Se dispone de la base de datos “SERIE”, la cual está compuesta por la fecha, la cantidad de personas que vieron el muro de pago, la intención de pago y las ventas. A continuación, se presentan los principales estadísticos descriptivos para cada una de estas variables

summary(SERIE)
##      Fecha     Vieron muro        Intención de pago     Ventas      
##  Min.   :NA    Length:181         Min.   : 20.00     Min.   : 11.00  
##  1st Qu.:NA    Class :character   1st Qu.: 40.00     1st Qu.: 25.00  
##  Median :NA    Mode  :character   Median : 53.00     Median : 33.00  
##  Mean   :NA                       Mean   : 59.62     Mean   : 36.81  
##  3rd Qu.:NA                       3rd Qu.: 73.00     3rd Qu.: 43.00  
##  Max.   :NA                       Max.   :183.00     Max.   :137.00  
##  NA's   :181

Para la variable Fecha, podemos ver que los datos van desde el 1 de septiembre de 2022 hasta el 28 de febrero de 2023.

Para la variable Vieron muro, podemos ver que la cantidad mínima de personas que vieron el muro fue de 912 y la máxima fue de 42,863. La media de personas que vieron el muro fue de 17,395, y la mediana fue de 18,452.

Para la variable Intención de pago, podemos ver que la cantidad mínima de personas que mostraron intención de pagar fue de 20 y la máxima fue de 183. La media de intención de pago fue de 59.62, y la mediana fue de 53.

Para la variable Ventas, podemos ver que la cantidad mínima de ventas fue de 11 y la máxima fue de 137. La media de ventas fue de 36.81, y la mediana fue de 33.

Reconocimiento de la serie

plot(z1, main="Ventas", ylab="Cantidad")

ts_plot(z1,color = "blue",title = "Suscripciones",Ytitle = "Cantidad")

IDENTIFICACIÓN

Visualizar la serie y analizar su comportamiento, identificar patrones y tendencias. También se pueden aplicar pruebas de estacionariedad para determinar si es necesario aplicar alguna transformación a la serie.

par(mfrow=c(1,3))
plot(z1)
acf(z1, lag.max = 60)
pacf(z1, lag.max = 60)

Raiz unitaria / Prueba de Dickey - Fuller

ADF (Augmented Dickey-Fuller) Test: es una prueba estadística que se utiliza para determinar si una serie de tiempo tiene raíces unitarias, lo que significa que la serie tiene una tendencia y no es estacionaria.

Hipótesis:

H0: La serie es no estacionaria: Tiene raíz unitaria

H1: La serie es estacionaria: No tiene raíz unitaria

Estadístico de prueba:

adf.test(z1)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  z1
## Dickey-Fuller = -3.3416, Lag order = 5, p-value = 0.06642
## alternative hypothesis: stationary

Resultado:

  1. El resultado muestra que la serie original z1 no es estacionaria ya que el valor del estadístico de prueba Dickey-Fuller es menor que el valor crítico, pero su p-valor es mayor que 0.05 (nivel de significancia), lo que indica que no hay suficiente evidencia para rechazar la hipótesis nula de que la serie no es estacionaria.

Phillips - Perron

PP (Phillips-Perron) Test: es otra prueba de raíz unitaria que es similar al ADF test.

pp.test(z1)
## 
##  Phillips-Perron Unit Root Test
## 
## data:  z1
## Dickey-Fuller Z(alpha) = -101.79, Truncation lag parameter = 4, p-value
## = 0.01
## alternative hypothesis: stationary

Dickey - Fuller (2)

ADF (Augmented Dickey-Fuller) Test: es una prueba estadística que se utiliza para determinar si una serie de tiempo tiene raíces unitarias, lo que significa que la serie tiene una tendencia y no es estacionaria.

Hipótesis:

H0: La serie es no estacionaria: Tiene raíz unitaria

H1: La serie es estacionaria: No tiene raíz unitaria

Estadístico de prueba:

adf.test(diff(z1))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(z1)
## Dickey-Fuller = -11.112, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary

Resultado:

  1. La primera diferencia de z1, diff(z1), sí es estacionaria ya que su valor de Dickey-Fuller es menor que su valor crítico y su p-valor es menor que 0.05.
par(mfrow=c(2,3))
plot(z1)
acf(z1, lag.max = 60)
pacf(z1, lag.max = 60)
plot(diff(z1))
abline(h=2*sqrt(var(diff(z1))), col="red", lty=2  )
abline(h=-2*sqrt(var(diff(z1))), col="red", lty=2  )
acf(diff(z1), lag.max = 60)
pacf(diff(z1), lag.max = 60)

ESTIMACIÓN

Verificacion de posibles modelos

par(mfrow=c(2,3))
plot(z1)
acf(z1,lag.max = 40)
pacf(z1,lag.max = 40)
plot(diff(z1))
abline(h=2*sqrt(var(diff(z1))), col="red", lty=2)
abline(h=-2*sqrt(var(diff(z1))), col="red", lty=2)
acf(diff(z1,lag.max = 40))
pacf(diff(z1,lag.max = 40))

ts_cor(diff(z1), lag.max = 40)
auto.arima(z1)
## Series: z1 
## ARIMA(3,1,3) 
## 
## Coefficients:
##           ar1      ar2     ar3     ma1      ma2      ma3
##       -1.2761  -0.2379  0.4066  0.7234  -0.5515  -0.8804
## s.e.   0.1005   0.1873  0.0967  0.0955   0.0747   0.0857
## 
## sigma^2 = 200.4:  log likelihood = -706.5
## AIC=1427.01   AICc=1427.68   BIC=1449.12

ARIMA (2,1,2) ARIMA (1,1,5) ARIMA (5,1,2) ARIMA (6,1,5)

modelo1 = stats::arima(z1,order = c(2,1,2),
                       fixed = c(NA,0,NA,NA))
modelo1
## 
## Call:
## stats::arima(x = z1, order = c(2, 1, 2), fixed = c(NA, 0, NA, NA))
## 
## Coefficients:
##          ar1  ar2      ma1     ma2
##       0.4893    0  -1.1140  0.1821
## s.e.  0.2017    0   0.2083  0.1741
## 
## sigma^2 estimated as 220.1:  log likelihood = -716.76,  aic = 1441.51
tt = modelo1$coef[which(modelo1$coef!=0)]/sqrt(diag(modelo1$var.coef)) ## Busco coeficientes en 0 y se eliminan del modelo
1-pt(abs(tt),(modelo1$nobs-length(modelo1$coef[which(modelo1$coef!=0)]))) ## Coeficientes significativos
##          ar1          ma1          ma2 
## 8.165207e-03 1.402540e-07 1.485890e-01
tt
##       ar1       ma1       ma2 
##  2.425429 -5.349015  1.045694

BIC

El criterio BIC (Bayesian Information Criterion) es una medida que se utiliza en estadística para evaluar diferentes modelos y seleccionar el que mejor se ajuste a los datos. El BIC toma en cuenta tanto la bondad de ajuste. Por lo tanto, un modelo con un valor de BIC más bajo se considera mejor que otro con un valor más alto.

BIC(modelo1)
## [1] 1454.149

Resultado:

-Se elige un modelo con un BIC más bajo, ya que, se busca encontrar el equilibrio entre la capacidad de ajuste del modelo y su simplicidad.

DIAGNÓSTICO

et = residuals(modelo1) #Errores
z1.fit = z1-et ##Reales menos errores residuales
fitted(modelo1)
## Time Series:
## Start = c(2022, 9) 
## End = c(2023, 2) 
## Frequency = 181 
##   [1] 23.97600 24.78966 27.53111 30.87053 39.79557 33.11317 37.51332 34.66037
##   [9] 30.80862 28.06383 26.46558 44.37510 37.75320 31.94309 29.31033 29.72500
##  [17] 47.42729 52.31841 79.02600 52.44385 51.07175 42.38735 50.53298 40.18303
##  [25] 43.73259 49.56792 36.46899 33.18955 31.24882 36.74522 31.30589 29.47499
##  [33] 31.43056 32.60932 30.76897 33.04334 31.57646 29.18722 24.95244 30.19204
##  [41] 32.39467 26.96811 34.44546 30.75960 31.77735 33.92279 34.59113 31.56690
##  [49] 28.96483 34.90874 30.09335 26.61748 25.46568 30.82080 31.70530 34.27464
##  [57] 30.62859 34.28958 31.59192 33.24427 36.36018 36.25388 30.85978 28.72776
##  [65] 33.57927 32.13652 29.54442 35.51877 40.49422 34.30210 30.32236 30.66832
##  [73] 34.67814 32.70007 34.85138 42.58883 34.09493 30.25648 36.19444 29.03861
##  [81] 29.67906 35.17497 33.56989 32.11282 33.95554 34.43035 41.75497 37.98574
##  [89] 47.50237 43.36411 37.97903 32.22348 30.47902 32.96170 33.65545 40.04957
##  [97] 35.81833 27.72466 27.94324 24.50741 27.22647 26.37578 30.35859 26.38448
## [105] 25.22592 23.15763 23.79473 24.77821 29.34008 24.55105 29.68146 27.66812
## [113] 28.00667 25.50869 25.56547 22.46654 22.96305 24.72824 28.82145 26.98505
## [121] 28.15300 22.55436 23.27227 23.24819 19.33737 27.44049 29.87439 31.92897
## [129] 30.97628 33.32889 33.90453 33.29861 33.06511 31.34589 28.38199 29.42043
## [137] 29.95620 35.68666 33.23594 33.59242 31.19404 30.98320 31.25315 33.16170
## [145] 44.21176 40.81597 44.67942 41.34296 35.28653 32.62950 42.57858 60.24948
## [153] 54.94992 57.74037 55.97819 53.64464 50.13849 44.16793 57.09402 50.46551
## [161] 46.77051 38.94869 37.93927 56.15197 48.57077 58.20695 54.34966 58.70712
## [169] 52.76331 49.24082 48.24240 51.52487 62.42504 57.41798 55.48806
par(mfrow=c(3,2))
plot(z1)
lines(z1.fit,col="red",lty=2)
plot(scale(et),type="l")
abline(h=2*sqrt(var(scale(et))), col="red", lty=2)
abline(h=-2*sqrt(var(scale(et))), col="red", lty=2)
acf(scale(et), lag.max = 20)
pacf(scale(et), lag.max = 20)
qqPlot(et)
## [1]  18 151
acf(abs(et))

Box Test

Es una prueba estadística utilizada para evaluar si la varianza de un conjunto de datos es constante en el tiempo:

Box.test(et,lag=6,type="Ljung-Box") # Se rechaza ya que es menor a 0.05 (grados de libertad)
## 
##  Box-Ljung test
## 
## data:  et
## X-squared = 8.6414, df = 6, p-value = 0.1948
tsdiag(modelo1,gof.lag = 20) ## Genera un grafico de los lags, las pruebas de hipotesis visualizadas

Resultado: - El resultado del Box-Ljung test indica que el modelo no presenta autocorrelación significativa en los residuos, ya que el valor de la estadística X-squared es menor al valor crítico para un nivel de significancia del 0.05 y el p-valor es mayor que 0.05. Esto sugiere que el modelo se ajusta adecuadamente a los datos.

Run Test

Prueba de runs es determina si los valores de la serie temporal están aleatoriamente distribuidos o no.

Ho: La secuencia de datos sigue un patrón aleatorio.

H1: La secuencia de datos no sigue un patrón aleatorio.

runs.test(as.factor(sign(et)), alternative = "two.sided")
## 
##  Runs Test
## 
## data:  as.factor(sign(et))
## Standard Normal = -0.56244, p-value = 0.5738
## alternative hypothesis: two.sided

Resultado: -En este caso, el estadístico de prueba es -0.56244 y el p-valor es 0.5738, lo que sugiere que no hay suficiente evidencia para rechazar la hipótesis nula.

PREDICCIÓN

Se genera un gráfico que muestra las predicciones del modelo modelo1 para los próximos 6 periodos, utilizando la función forecast con el argumento h=6. El argumento fan=T indica que se deben mostrar los intervalos de predicción.

par(mfrow=c(1,1))
plot(forecast(modelo1,h=6,fan = T))
lines(fitted(modelo1),col="blue")

Resultado: -El resultado es un gráfico con dos líneas: una que representa las predicciones del modelo para los próximos 6 periodos “azul”, y otra que muestra los valores ajustados del modelo para los datos originales. Además, se muestran los intervalos de predicción para las predicciones.